package tu.seqlist;

public class SqList{
	private Object[] listElem;								//线性表存储空间
	private int curLen;											//线性表的当前长度
	
	//顺序表类的构造函数，构造一个存储空间容量为maxSize 的线性表
	public SqList(int maxSize,Object[] str,int len) {
		this.curLen = len;													   //置顺序表的当前长度为0
		this.listElem = new Object[maxSize];				  //为顺序表分配maxSize个存储单元
		// this.listElem = Arrays.copyOf(str, str.length);//将传递过来的数组赋值给顺序表
		for (int i = 0; i < str.length; i++) 
			listElem[i] = str[i];
	}
	
	//将一个已经存在的线性表置成空表
	public void clear() {
		curLen = 0;													//置顺序表的当前长度为0
	}
	
	//判断线性表中的数据元素的个数是否为0，若为0，则返回true；否则返回false
	public boolean isEmpty() {
		return curLen == 0;
	}
	
	//求线性表中的数据元素的个数并返回其值
	public int length() {
		return curLen;												//返回顺序表当前长度
	}
	
	//读取到线性表中的第i个数据元素并由函数返回其值，其中i的取值范围为：0 ≤ i ≤ length() - 1，若i值不在此范围则抛出异常
	public Object get(int i) throws Exception{
		if(i < 0 || i > curLen - 1) {																	// i 小于0或者大于表长减1
			throw new Exception("第" + i + "个元素不存在");					//异常抛出
		}
		return listElem[i];																			//返回顺序表中第1个数据元素
	}
	
	//在线性表的第 i 个数据元素之前插入一个值为 x 的数据元素
	public void insert(int i, Object x) throws Exception{
		if(curLen == listElem.length)
			throw new Exception("顺序表已满");
		if(i < 0 || i > curLen)
			throw new Exception("插入位置不合法"); 
		for(int j = curLen; j>i; j--)
			listElem[j] = listElem[j-1];															//插入位置及其之后的所有数据元素后移一位
		
		listElem[i] = x;																				//插入x
		curLen++;																							//表长加1
	}

//	删除并返回线性表中的第i个数据元素
	public Object remove(int i) throws Exception {
		Object old = listElem[i];
		if(i < 0 ||  i > curLen )
			throw new Exception ("删除位置不合法");
		for(int j = i;j < curLen - 1; j++)
			listElem[j] = listElem[j + 1];														//被删除元素之后的所有数据元素元素左移一个存储位置
		curLen--;																							//表长减1
		return old;
	}

//	返回线性表中首次出现指定的数据元素的位序号，若线性表中不包含此数据元素，则返回 - 1 
	public int indexOf(Object x) throws Exception{
		int j = 0;																								
		while(j < curLen && !listElem[j].equals(x))								//依次比较
			j++;																									
		if(j < curLen)
			return j;																							//返回值为 x 的数据元素在顺序表中的位置
		else
			return -1;																						//其值为 x 的数据元素在顺序表中不存在
	}

	//就地逆置
	public Object[] re_Objects(){
		Object temp;
		for (int i = 0; i <= (int) curLen/2; i++) {
			temp = this.listElem[i];
			this.listElem[i] = this.listElem[curLen - i - 1];
			this.listElem[curLen - i - 1] = temp;
		}
		return listElem;

	}

	//循环右移k位时间复杂度O(n)
	public Object[] forRE_Objects(int k) throws Exception {
		
		for(int cur = curLen; cur > 0; cur--) {
			this.listElem[cur - 1 + k] =  this.listElem[cur - 1];
		}
		curLen = curLen + k;
		for(int i = 0; i < k; i++){
			this.listElem[i] = this.listElem[curLen + i - k];
		}

		//this.curLen = this.curLens - 3;
		for (int i = 0; i < k; i++) {
			remove(this.curLen - 1);
		}


		return listElem;
	}

	//输出线性表中的数据元素
	public void display() {

		for(int j = 0; j < this.curLen; j++)
			System.out.print(this.listElem[j]+" ");
		System.out.println();																//换行
	}
}
